Tugas Restful API pada Laravel

API

API (Application Programming Interface) adalah sekumpulan aturan dan protokol yang memungkinkan aplikasi dari platform yang berbeda untuk berkomunikasi dan saling terintegrasi.

Mengapa API Penting?

API berfungsi sebagai jembatan komunikasi yang memungkinkan berbagai aplikasi untuk saling berinteraksi dan bertukar data. Di era digital saat ini, API telah menjadi tulang punggung bagi hampir semua aplikasi modern. Fungsi utamanya adalah memfasilitasi pertukaran informasi dan fungsionalitas antar sistem yang berbeda, tanpa perlu memahami detail internal masing-masing aplikasi.

Dengan kata lain, API menyediakan serangkaian protokol, rutinitas, dan alat yang memungkinkan pengembang perangkat lunak untuk membangun aplikasi yang dapat "berbicara" satu sama lain. Ini berarti bahwa alih-alih membangun semua fitur dari awal, aplikasi dapat memanfaatkan layanan atau data yang disediakan oleh aplikasi lain melalui API.

Contohnya, ketika Anda menggunakan aplikasi cuaca di ponsel Anda, aplikasi tersebut kemungkinan besar tidak memiliki sensor cuaca sendiri. Sebaliknya, aplikasi tersebut menggunakan API yang disediakan oleh layanan cuaca pihak ketiga untuk mengambil data suhu, kelembaban, dan prakiraan cuaca. Demikian pula, saat Anda melakukan pembelian online dan memilih untuk membayar dengan dompet digital, aplikasi e-commerce akan berinteraksi dengan API penyedia dompet digital untuk memproses transaksi.

Secara keseluruhan, API telah merevolusi cara aplikasi dibangun dan berinteraksi, mendorong inovasi dan efisiensi dalam ekosistem digital yang semakin terhubung.

  • Integrasi dengan layanan pihak ketiga
  • Memisahkan frontend dan backend
  • Mendukung multiple platform (web, mobile, desktop)
  • Memungkinkan arsitektur microservices

Konsep Dasar API

Agar lebih memahami konsep dasar API, berikut adalah analogi API pemesanan makanan pada restoran.

Analogi API

Komponen Utama API

Berikut adalah ilustrasi komponen utama API:

Komponen Utama API

Jenis-jenis API

  • Web API: Menggunakan protokol HTTP/HTTPS
  • REST API: Mengikuti arsitektur REST
  • GraphQL API: Query language untuk API
  • SOAP API: Protocol berbasis XML
  • Library API: Interface untuk library atau framework
  • Operating System API: Interface dengan sistem operasi
  • Database API: Interface untuk mengakses database

RESTful API

REST (Representational State Transfer) adalah arsitektur untuk merancang web services. REST bukan protokol atau standar, melainkan seperangkat prinsip desain.

Prinsip REST (Representational State Transfer)

  • Client-Server Architecture
  • Stateless
  • Cacheable
  • Uniform Interface
  • Layered System
  • Code on Demand

Langkah-langkah Membuat API

Buat Projek Laravel Baru

Dengan mengetik kode berikut:

composer create-project laravel/laravel api-project

Membuat Migrasi Database

Dengan mengetik kode berikut:

php artisan make:migration create_products_table

Kemudian, ketik kode program berikut:

Schema::create('products', function (Blueprint $table) { 
    $table->id(); 
    $table->string('name'); 
    $table->text('description'); 
    $table->decimal('price', 10, 2); 
    $table->integer('stock'); 
    $table->timestamps(); 
});

Jalankan migration dengan kode berikut:

php artisan migrate

Membuat Model

php artisan make:model Product

Kemudian, ketik kode program berikut:

class Product extends Model 
{ 
    protected $fillable = [ 
        'name', 'description', 'price', 'stock' 
    ]; 
    
    protected $casts = [ 
        'price' => 'decimal:2' 
    ]; 
}

Membuat API Routes

Install API terlebih dahulu dengan kode berikut:

php artisan install:api

Ketik kode berikut di file routes/api.php:

// routes/api.php
Route::apiResource('products', ProductController::class);

// manual:
Route::get('products', [ProductController::class, 'index']);
Route::post('products', [ProductController::class, 'store']);
Route::get('products/{product}', [ProductController::class, 'show']);
Route::put('products/{product}', [ProductController::class, 'update']);
Route::delete('products/{product}', [ProductController::class, 'destroy']);

Membuat API Controller

Buka terminal lalu jalankanlah kode berikut ini:

php artisan make:controller ProductController --api

Ketik kode berikut pada controller:

class ProductController extends Controller 
{ 
    public function index() 
    { 
        $products = Product::all(); 
        return response()->json([ 
            'status' => 'success', 
            'data' => $products 
        ]); 
    } 
    
    public function store(Request $request) 
    { 
        $validated = $request->validate([ 
            'name' => 'required|string|max:255', 
            'description' => 'required|string', 
            'price' => 'required|numeric|min:0', 
            'stock' => 'required|integer|min:0' 
        ]); 
        
        $product = Product::create($validated); 
        
        return response()->json([ 
            'status' => 'success', 
            'message' => 'Product created successfully', 
            'data' => $product 
        ], 201); 
    } 
    
    public function show(Product $product) 
    { 
        return response()->json([ 
            'status' => 'success', 
            'data' => $product 
        ]); 
    } 
    
    public function update(Request $request, Product $product) 
    { 
        $validated = $request->validate([ 
            'name' => 'sometimes|string|max:255', 
            'description' => 'sometimes|string', 
            'price' => 'sometimes|numeric|min:0', 
            'stock' => 'sometimes|integer|min:0' 
        ]); 
        
        $product->update($validated); 
        
        return response()->json([ 
            'status' => 'success', 
            'message' => 'Product updated successfully', 
            'data' => $product 
        ]); 
    } 
    
    public function destroy(Product $product) 
    { 
        $product->delete(); 
        
        return response()->json([ 
            'status' => 'success', 
            'message' => 'Product deleted successfully' 
        ]); 
    } 
}

API Resource

Salah satu fitur API Resource adalah kemampuan untuk mengubah model data atau kumpulan menjadi format JSON yang konsisten dan mudah dikustomisasi untuk tanggapan API. API Resource berfungsi sebagai lapisan transformasi antara model Eloquent dan tanggapan JSON yang dikirim ke client, sehingga dapat digunakan untuk mengatur format output JSON, menyembunyikan kolom sensitif, menambahkan kolom komputasi, dan menghasilkan tanggapan yang konsisten.

1. Membuat Resource

php artisan make:resource ProductResource

Kemudian, isi dengan kode program berikut:

class ProductResource extends JsonResource 
{ 
    public function toArray($request) 
    { 
        return [ 
            'id' => $this->id, 
            'name' => $this->name, 
            'description' => $this->description, 
            'price' => $this->price, 
            'stock' => $this->stock, 
            'created_at' => $this->created_at->format('Y-m-d H:i:s'), 
            'updated_at' => $this->updated_at->format('Y-m-d H:i:s') 
        ]; 
    } 
}

2. Menggunakan Resource di Controller

Mengubah method index dan show menggunakan API Resource dengan mengetik kode berikut:

public function index() 
{ 
    $products = Product::all(); 
    return ProductResource::collection($products); 
} 

public function show(Product $product) 
{ 
    return new ProductResource($product); 
}

Validasi dan Error Handling

Form Request Validation

php artisan make:request StoreProductRequest

Kemudian ketikkan kode berikut pada app/Http/Requests/StoreProductRequest.php:

class StoreProductRequest extends FormRequest 
{ 
    public function authorize() 
    { 
        return true; 
    } 
    
    public function rules() 
    { 
        return [ 
            'name' => 'required|string|max:255', 
            'description' => 'required|string', 
            'price' => 'required|numeric|min:0', 
            'stock' => 'required|integer|min:0' 
        ]; 
    } 
    
    public function messages() 
    { 
        return [ 
            'name.required' => 'Nama produk wajib diisi', 
            'price.min' => 'Harga tidak boleh negatif' 
        ]; 
    } 
}

Global Exception Handler

Tambahkan kode program berikut pada app/Exceptions/Handler.php untuk menangani Exception:

public function render($request, Throwable $exception)
{
    if ($request->wantsJson()) {
        if ($exception instanceof ValidationException) {
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed',
                'errors' => $exception->errors()
            ], 422);
        }
        
        if ($exception instanceof ModelNotFoundException) {
            return response()->json([
                'status' => 'error',
                'message' => 'Resource not found'
            ], 404);
        }
    }
    
    return parent::render($request, $exception);
}

Mengakses API Products dengan Postman

1. Download Postman pada link officialnya:

Postman

2. Buka projek Laravel tadi lalu ketikkan kode berikut:

php artisan serve

3. Mengambil semua products dengan method GET dan URL http://127.0.0.1:8000/api/products

Jika berhasil:

Hasil GET

4. Menambahkan products dengan method POST dan URL http://127.0.0.1:8000/api/products/

Body (JSON):

{
    "name": "Smartphone Android",
    "description": "Smartphone dengan kamera 108MP dan RAM 8GB",
    "price": 4500000.00,
    "stock": 25
}

Jika berhasil, akan muncul seperti ini:

Hasil POST

5. Mengambil Product Berdasarkan ID:

Method: GET

URL: http://localhost:8000/products/{id}

Contoh: http://localhost:8000/products/1

Hasil GET ID

6. Update product:

Method: PUT

URL: http://localhost:8000/products/{id}

Contoh: http://localhost:8000/products/1

Body (JSON):

{
    "name": "Laptop Gaming Updated",
    "description": "Laptop gaming dengan spek tinggi dan SSD 1TB",
    "price": 16500000.00,
    "stock": 8
}
Hasil PUT

7. Hapus Product:

Method: DELETE

URL: http://localhost:8000/products/{id}

Contoh: http://localhost:8000/products/1

Hasil DELETE